package org.itheima.googleplay.ui.fragment;

import java.util.List;
import java.util.Map;

import org.itheima.googleplay.ui.fragment.LoadingPager.LoadedResult;
import org.itheima.googleplay.utils.UIUtils;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;

/**
 * @包名: org.itheima.googleplay.ui.fragment
 * @类名: BaseFragment
 * @作者: 肖琦
 * @创建时间 : 2015-3-20 下午2:32:27
 * 
 * @描述: 页面的基类
 * 
 * @SVN版本: $Rev: 11 $
 * @更新人: $Author: xq $
 * @更新时间: $Date: 2015-03-22 11:35:38 +0800 (星期日, 22 三月 2015) $
 * 
 * @更新描述:
 */
public abstract class BaseFragment extends Fragment
{

	// 1. 加载数据
	// 2. 加载数据为空
	// 3. 加载失败
	// 4. 加载成功显示

	private LoadingPager	mPager;

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
	{

		// 共通点：
		// 1. 加载数据
		// 2. 加载数据为空
		// 3. 加载失败

		// 不同点：
		// 4. 加载成功显示

		// 只有一个能显示
		// 通过一个容器，来装载所有的View，拿到数据,通过数据判断来选中显示哪一个

		// 做逻辑处理，判断是否改显示哪一个View

		if (mPager == null)
		{
			mPager = new LoadingPager(UIUtils.getContext()) {

				@Override
				protected View onCreateSuccessView()
				{
					return onSuccessView();
				}

				@Override
				protected LoadedResult onStartLoadData()
				{
					return onLoadData();
				}
			};
		}
		else
		{
			ViewParent parent = mPager.getParent();
			if (parent != null && parent instanceof ViewGroup)
			{
				((ViewGroup) parent).removeView(mPager);
			}
		}

		return mPager;
	}

	// 拿数据的行为
	public void loadData()
	{
		if (mPager != null)
		{
			mPager.loadData();
		}
	}

	protected LoadedResult checkState(Object data)
	{
		if (data == null) { return LoadedResult.EMPTY; }

		if (data instanceof List)
		{
			if (((List) data).size() == 0) { return LoadedResult.EMPTY; }
		}

		if (data instanceof Map)
		{
			if (((Map) data).size() == 0) { return LoadedResult.EMPTY; }
		}

		return LoadedResult.SUCCESS;
	}

	protected abstract View onSuccessView();

	protected abstract LoadedResult onLoadData();
}
